﻿#include <stdio.h>
#include "../common/common.h"

#define N 10

__global__ void add_short(int *a, int *b, int *c) {
	int tid = threadIdx.x; // xử lí phần tử thứ tid
	if (tid < N)
		c[tid] = a[tid] + b[tid];
}

int main_short( void ) {
	int a[N], b[N], c[N], i;
	int *dev_a, *dev_b, *dev_c;
	
	// cấp phát bộ nhớ trên GPU
	SAFE_CALL( cudaMalloc((void**)&dev_a, N * sizeof(int)) );
	SAFE_CALL( cudaMalloc((void**)&dev_b, N * sizeof(int)) );
	SAFE_CALL( cudaMalloc((void**)&dev_c, N * sizeof(int)) );

	// khởi tạo mảng a và b trên CPU
	for (i=0; i<N; i++) {
		a[i] = i + 10;
		b[i] = i * i;
	}

	// chép mảng a và b sang GPU
	SAFE_CALL( cudaMemcpy(dev_a, a, N * sizeof(int),
					cudaMemcpyHostToDevice) );
	SAFE_CALL( cudaMemcpy(dev_b, b, N * sizeof(int),
					cudaMemcpyHostToDevice) );

	add_short<<<1, N>>>(dev_a, dev_b, dev_c);

	// chép kết quả từ GPU về CPU
	SAFE_CALL( cudaMemcpy(c, dev_c, N * sizeof(int),
					cudaMemcpyDeviceToHost) );
	// hiển thị kết quả
	for (i=0; i<N; i++) {
		printf("%d + %d = %d\n", a[i], b[i], c[i]);
	}

	// giải phóng bộ nhớ GPU
	cudaFree(dev_a);
	cudaFree(dev_b);
	cudaFree(dev_c);

	return 0;
}
